/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package base.function.operator;

import base.value.CValue;
import base.value.CValue.CType;

public class CRandom extends CNumericBinaryFunction {
	@Override
	public int ToInt( CValue Value0, CValue Value1 ) {
		if ( GetType( Value0, Value1 ) == CType.Float ) {
			return (int) GetFloatRandom( Value0, Value1 );
		} else {
			return GetIntRandom( Value0, Value1 );
		}
	}



	@Override
	public float ToFloat( CValue Value0, CValue Value1 ) {
		if ( GetType( Value0, Value1 ) == CType.Float ) {
			return (float) GetFloatRandom( Value0, Value1 );
		} else {
			return (float) GetIntRandom( Value0, Value1 );
		}
	}



	private int GetIntRandom( CValue Value0, CValue Value1 ) {
		float V0 = Value0.ToInt();
		float V1 = Value1.ToInt() + 0.999999f;
		if ( V1 < V0 ) Error( "Нижняя граница больше верхней" );
		return (int) Math.floor( V0 + ( V1 - V0 ) * Math.random() );
	}



	private float GetFloatRandom( CValue Value0, CValue Value1 ) {
		float V0 = Value0.ToFloat();
		float V1 = Value1.ToFloat();
		if ( V1 < V0 ) Error( "Нижняя граница больше верхней" );
		return ( float ) ( V0 + ( V1 - V0 ) * Math.random() );
	}
}
